/*
 * encoder.h
 * 正交编码器驱动头文件
 * 
 * 本文件定义了用于四个编码器和四个电机控制的接口。
 * 支持读取编码器计数值和方向，以及控制电机速度和方向。
 */

#ifndef ENCODER_H_
#define ENCODER_H_

#include "ti_msp_dl_config.h"
#include <stdint.h>
#include <stdbool.h>

// 编码器结构体定义
typedef struct {
    volatile int32_t count;    // 计数值，随编码器旋转累加或减少
    volatile int8_t direction; // 方向: 1=正向(顺时针), -1=反向(逆时针), 0=静止
    uint8_t last_state;        // 上一个编码器状态，用于状态转换检测
} Encoder_t;

/*
 * 编码器引脚定义 - 使用配置好的GPIO端口和引脚
 * 每个编码器有两个相位信号(A和B)，相位差为90度
 * 通过检测两个信号的变化顺序来判断旋转方向
 */
// 编码器1引脚定义
#define ENCODER1_A_PORT    GPIOA
#define ENCODER1_A_PIN     DL_GPIO_PIN_5
#define ENCODER1_B_PORT    GPIOA
#define ENCODER1_B_PIN     DL_GPIO_PIN_4

// 编码器2引脚定义
#define ENCODER2_A_PORT    GPIOA
#define ENCODER2_A_PIN     DL_GPIO_PIN_8
#define ENCODER2_B_PORT    GPIOA
#define ENCODER2_B_PIN     DL_GPIO_PIN_27

// 编码器3引脚定义
#define ENCODER3_A_PORT    GPIOA
#define ENCODER3_A_PIN     DL_GPIO_PIN_26
#define ENCODER3_B_PORT    GPIOA
#define ENCODER3_B_PIN     DL_GPIO_PIN_25

// 编码器4引脚定义
#define ENCODER4_A_PORT    GPIOA
#define ENCODER4_A_PIN     DL_GPIO_PIN_10
#define ENCODER4_B_PORT    GPIOA
#define ENCODER4_B_PIN     DL_GPIO_PIN_11


// PWM引脚定义 - 用于控制电机速度
#define MOTOR1_PWM_PORT    GPIOA
#define MOTOR1_PWM_PIN     DL_GPIO_PIN_0

#define MOTOR2_PWM_PORT    GPIOA
#define MOTOR2_PWM_PIN     DL_GPIO_PIN_1

#define MOTOR3_PWM_PORT    GPIOA
#define MOTOR3_PWM_PIN     DL_GPIO_PIN_3

#define MOTOR4_PWM_PORT    GPIOA
#define MOTOR4_PWM_PIN     DL_GPIO_PIN_12

/*
 * 电机控制函数声明
 */
// 初始化所有电机控制引脚
void Motor_Init(void);

// 设置指定电机的速度和方向
// motor_id: 电机编号(1-4)
// speed: -100到100之间的值，负值表示反转，正值表示正转，0表示停止
void Motor_SetSpeed(uint8_t motor_id, int32_t speed);


/*
 * 编码器函数声明
 */
// 初始化所有编码器
void Encoder_Init(void);

// 获取编码器1-4的计数值
int32_t Encoder1_GetCount(void);
int32_t Encoder2_GetCount(void);
int32_t Encoder3_GetCount(void);
int32_t Encoder4_GetCount(void);

// 获取编码器1-4的当前旋转方向
int8_t Encoder1_GetDirection(void);
int8_t Encoder2_GetDirection(void);
int8_t Encoder3_GetDirection(void);
int8_t Encoder4_GetDirection(void);

// 重置编码器1-4的计数值为0
void Encoder1_Reset(void);
void Encoder2_Reset(void);
void Encoder3_Reset(void);
void Encoder4_Reset(void);

// 更新所有编码器状态，需要在主循环中定期调用
void Encoder_Update(void);

#endif /* ENCODER_H_ */